package AttributeThreading;

/**
 * 线程中断 : 方法2. 使用标准库里自带的一个标记~~
 *
 * Date: 2022-09-11   8月14日的课程
 * Time: 11:00
 */
public class TestDemo11 {
    public static void main(String[] args) {

        Thread thread = new Thread(() -> {
            while (!Thread.currentThread().isInterrupted()) {
                    // currentThread() 是 Thread 的静态方法.
                    // 通过该方法, 可以拿到当前线程的实列(拿到当前线程对应的 Thread 对象的引用)
                    // isInterrupted() 方法就是在判定标志位

                System.out.println("使用标准库自带标志位的方法2");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    //e.printStackTrace();
                    break; //为什么加一个 break,并且将上一行代码注释掉 下面有解释.
                }
            }

            System.out.println("start线程执行完毕!!");
        });

        thread.start();

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        thread.interrupt(); // 在主线程中, 通过该行代码来中断这个线程, 即设置标志位位true !!
        // interrupt() 方法的行为有两种情况 :
        // 1. thread 线程在运行中, 会设置标志位为true.
        // 2. thread 线程在阻塞中(sleep), 会触发一个 InterruptedException 异常, 该异常就是上面循环中 catch 的异常,
        //    它会把sleep提前唤醒!! 但是对于sleep, wait 等阻塞方法, 虽然此时也会设置标志位,但是会被清除掉 -> 宏观上就好像没有设置标志位!!
        //    所以线程没有被中断, 由于上面try-catch中只是打印异常日志, 并没有结束循环, 因此循环仍然还在进行中!!!
        //    因此要想顺利结束循环, 需要在 catch 中加一个 break!!!

        System.out.println("通过标志位让thread线程结束!");

    }
}
